{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "'''\n",
    "【课程6.2】  自定义函数\n",
    "\n",
    "如何创建函数？def语句\n",
    "\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "输入值大于等于5\n"
     ]
    }
   ],
   "source": [
    "# 定义函数\n",
    "\n",
    "def f(x):\n",
    "    if x < 5:\n",
    "        print('输入值小于5')\n",
    "    else:\n",
    "        print('输入值大于等于5')  # 定义函数，其中x是参数（局部变量）\n",
    "f(10)  # 运行函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "None 4\n"
     ]
    }
   ],
   "source": [
    "# 关于retuen\n",
    "\n",
    "def f1(x):\n",
    "    y = 2**x  # 没有return\n",
    "    \n",
    "def f2(x):\n",
    "    y = 2**x\n",
    "    return y # 含有return\n",
    "\n",
    "print(f1(2),f2(2))\n",
    "# return语句退出函数，并返回一个表达式。不带参数值的return语句返回None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "100\n",
      "1000\n"
     ]
    }
   ],
   "source": [
    "# 默认参数\n",
    "\n",
    "def f(x,n = 2):\n",
    "    return(x**n)\n",
    "print(f(10))\n",
    "print(f(10,3))\n",
    "# n = 2,这里n的默认值为2，如果不输入则以默认值为主"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1,)\n",
      "('a', 'b')\n",
      "(1, 2, 3, [44, 33])\n",
      "('a', 'b')\n",
      "<class 'tuple'>\n"
     ]
    }
   ],
   "source": [
    "# 可变参数\n",
    "\n",
    "def f(*x):\n",
    "    print(x)\n",
    "    return x\n",
    "f(1)\n",
    "f('a','b')\n",
    "f(1,2,3,[44,33])\n",
    "print(type(f('a','b')))\n",
    "# 通过*来定义可变参数\n",
    "# 默认会把可变参数传入一个元祖！"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "小作业\n",
    "\n",
    "① 函数f（x），输入一个字符串，分别print出每个字母\n",
    "\n",
    "② f(x,y,z),函数内部算法：生成 ((x+y)*(x-y))**z\n",
    "\n",
    "③ 编写一个求平均值的函数  f(*m)\n",
    "\n",
    "④ 定义一个函数，用于求矩形面积、圆形面积\n",
    "\n",
    "⑤ 定义一个函数，函数的作用是把输入的列表变成一连串字典的key，并生成字典，需要用input输入\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "'''\n",
    "【课程6.3】  局部变量及全局变量\n",
    "\n",
    "定义在函数内部的变量拥有一个局部作用域，定义在函数外的拥有全局作用域。\n",
    "\n",
    "局部变量只能在其被声明的函数内部访问，而全局变量可以在整个程序范围内访问。调用函数时，所有在函数内声明的变量名称都将被加入到作用域中\n",
    "\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "请输入一个数字：60\n",
      "函数内为局部变量：呵呵哒\n",
      "函数外为全局变量：60\n"
     ]
    }
   ],
   "source": [
    "# 演示案例\n",
    "\n",
    "def f(m):\n",
    "    m = '呵呵哒'  # 函数作用：把输入变量指向“呵呵哒”\n",
    "    print(\"函数内为局部变量：%s\" % m)    \n",
    "\n",
    "a = input('请输入一个数字：')\n",
    "f(a)\n",
    "print(\"函数外为全局变量：%s\" % a)\n",
    "# f（m）中，m是函数的参数，f(x)是吧x的值赋予了m，但x值自己本身不受影响，所以执行函数后，是在函数局部“变化”了x\n",
    "# 什么是局部变量？ → 当函数定义内声明变量的时候，它们与函数外具有相同名称的其他变量没有任何关系!\n",
    "# 即变量名称对于函数来说是“局部”的。这称为变量的作用域。所有变量的作用域是它们被定义的块，从它们的名称被定义的那点开始。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "请输入一个数字：60\n",
      "输入变量值：60\n",
      "函数内转为全局变量：呵呵哒\n"
     ]
    }
   ],
   "source": [
    "# global语句 → 把局部变量变为全局变量\n",
    "\n",
    "def f():\n",
    "    global a\n",
    "    a = '呵呵哒'  \n",
    "    print(\"函数内转为全局变量：%s\" % a)    \n",
    "\n",
    "a = input('请输入一个数字：')\n",
    "print(\"输入变量值：%s\" % a)\n",
    "f()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "'''\n",
    "【课程6.4】  匿名函数Lambda\n",
    "\n",
    "lambda 语句创建匿名函数。\n",
    "\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "9\n",
      "9\n"
     ]
    }
   ],
   "source": [
    "# 示例\n",
    "\n",
    "def fun(a,b,c):\n",
    "    return a+b+c\n",
    "print(fun(2,3,4))\n",
    "# def创建自定义函数，求和\n",
    "\n",
    "f = lambda a,b,c:a+b+c\n",
    "print(f(2,3,4))\n",
    "# lambda作为匿名函数，是不需要函数名的 → 需要一个函数，又不想动脑筋去想名字，这就是匿名函数\n",
    "# lambda的主体是一个表达式，而不是一个代码块。\n",
    "# lambda只有一行，仅仅能在lambda表达式中封装有限的逻辑进去。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "小作业\n",
    "\n",
    "① 用lambda创建一个求元素个数的匿名函数\n",
    "\n",
    "② 定义一个函数，可将输入的所有数字从大到小依次排序\n",
    "\n",
    "③ 定义一个函数，随机输入一个学生的成绩后，学习成绩>=90分的同学用A表示，60-89分之间的用B表示，60分以下的用C表示，最后输出成绩评分\n",
    "\n",
    "④ 定义一个函数，可统计出输入任意的字符中英文字母、空格、数字和其它字符的个数"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
